package DAO.TupleDAO;

import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import DAO.DAO_Bd;
import Metier.Tuples.Tuple;
import Metier.Tuples.Tuples;

public abstract class TupleDAO_Bd implements TupleDAO {
	protected DAO_Bd dao;
	protected PreparedStatement pstListe;


	public void init() {
		try 
		{
			pstListe = dao.getCx().prepareStatement("SELECT * FROM ?");
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}

	public Tuples getAllTuple(String nomTable) throws SQLException
	{
		Tuples tuples = new Tuples(nomTable);
		ResultSet rs = null;
		rs = this.dao.getSt().executeQuery("select * from "+nomTable);
		ResultSetMetaData rsm=null;
		int nbCol=0;
		while(rs.next())
		{
			if (rsm == null)
			{	rsm = rs.getMetaData();
			nbCol = rsm.getColumnCount();
			List<String> listeTitre = new ArrayList<String>();
			for(int i=0;i<nbCol;i++)
			{
				listeTitre.add(rsm.getColumnName(i+1));
			}
			tuples.setTitre(listeTitre);
			}
			Tuple tuple = new Tuple();
			for(int i=0;i<nbCol;i++)
			{
				
				try {
					if(rs.getObject(i+1)!=null)
						tuple.add(String.valueOf(rs.getObject(i+1)));
					else
						tuple.add("");
				} catch (Exception e) {
					tuple.add("");
				}
			}
			tuples.add(tuple);
		}
		rs.close();
		return tuples;
	}

	public boolean delete(String nomTable,List<String> listeTitre, Tuple tuple) throws SQLException
	{
		String requete = "DELETE from "+nomTable+" WHERE ";
		for(int i=0;i<listeTitre.size();i++)
		{
			if(!tuple.get(i).equals(""))
			{
				if(i!=0)
					requete+=" and ";
				requete+=listeTitre.get(i);
				requete+=" = ";
				requete+="'"+tuple.get(i)+"'";
			}
		}
		int nb = this.dao.getSt().executeUpdate(requete);
		return (nb!=0);
	}

	public void create(String nomTable, Tuple tuple) throws SQLException
	{
		String requete = "Insert into "+nomTable+" values ( ";
		for(int i=0;i<tuple.size();i++)
		{
			if(i!=0)
				requete+=" , ";
			requete+="'"+tuple.get(i)+"'";
		}
		requete+=" )";
		this.dao.getSt().executeUpdate(requete);
	}

	public Tuples getAllTitre(String nomTable) throws SQLException
	{
		Tuples tuples = new Tuples(nomTable);
		DatabaseMetaData md = dao.getCx().getMetaData();
		ResultSet resultat = md.getColumns(null, null, nomTable, "%");
		List<String> listeTitre = new ArrayList<String>();
		while (resultat.next()) 
		{
			listeTitre.add(resultat.getString("COLUMN_NAME"));
		}
		tuples.setTitre(listeTitre);
		resultat.close();
		return tuples;
	}

	public boolean modifier(String nomTable,List<String> listeTitre, Tuple tuple, Tuple tuple2) throws SQLException
	{
		for(int i=0;i<listeTitre.size();i++)
		{
			String requete = "Update "+nomTable+" SET "+listeTitre.get(i)+" = '"+tuple.get(i)+"' WHERE ";
			for(int j=0;j<listeTitre.size();j++)
			{
				if(!tuple.get(j).equals(""))
				{
					if(j!=0)
						requete+=" and ";
					requete+=listeTitre.get(j);
					requete+=" = ";
					requete+="'"+tuple2.get(j)+"'";
				}
			}
			this.dao.getSt().executeUpdate(requete);
		}
		return true;
	}
}